/**
 * 工具函数模块
 * 包含游戏中所有的辅助工具函数
 */

import { TildeType } from './const';
import { GameState } from './object';

/**
 * 计算两点之间的曼哈顿距离
 * @param pos1 - 位置1 {x, y}
 * @param pos2 - 位置2 {x, y}
 * @returns 曼哈顿距离
 */
export function calculateDistance(pos1: {x: number, y: number}, pos2: {x: number, y: number}): number {
    return Math.abs(pos1.x - pos2.x) + Math.abs(pos1.y - pos2.y);
}

/**
 * 计算两点之间的合法距离（只允许水平或垂直移动）
 * @param pos1 - 位置1 {x, y}
 * @param pos2 - 位置2 {x, y}
 * @returns 合法距离，如果不能直接到达则返回-1
 */
export function calculateLegalDistance(pos1: {x: number, y: number}, pos2: {x: number, y: number}): number {
    const dx = Math.abs(pos2.x - pos1.x);
    const dy = Math.abs(pos2.y - pos1.y);

    // 只允许水平或垂直方向，不允许对角线
    if (dx > 0 && dy > 0) {
        return -1; // 不能直接到达
    }

    // 返回水平或垂直距离
    return Math.max(dx, dy);
}

/**
 * 检查位置是否在范围内（只允许水平或垂直方向，不允许对角线）
 * @param fromPos - 起始位置 {x, y}
 * @param toPos - 目标位置 {x, y}
 * @param rangeVal - 范围
 * @returns 是否在范围内
 */
export function isInRange(fromPos: {x: number, y: number}, toPos: {x: number, y: number}, rangeVal: number): boolean {
    const legalDistance = calculateLegalDistance(fromPos, toPos);
    return legalDistance !== -1 && legalDistance <= rangeVal;
}

/**
 * 获取从起点到终点的方向
 * @param fromPos - 起始位置 {x, y}
 * @param toPos - 目标位置 {x, y}
 * @returns 方向向量 {x, y}
 */
export function getDirectionTo(fromPos: {x: number, y: number}, toPos: {x: number, y: number}): {x: number, y: number} {
    const dx = toPos.x - fromPos.x;
    const dy = toPos.y - fromPos.y;

    if (Math.abs(dx) > Math.abs(dy)) {
        return { x: dx > 0 ? 1 : -1, y: 0 };
    } else {
        return { x: 0, y: dy > 0 ? 1 : -1 };
    }
}

/**
 * 获取位置状态
 * @param input - 游戏状态
 * @param pos - 位置 {x, y}
 * @returns 位置状态
 */
export function getPositionState(input: GameState, pos: {x: number, y: number}): string {
    if (!isValidPosition(input, pos)) {
        return 'invalid';
    }

    // 检查地形是否可移动：只有平地可以移动，河流和其他地形都阻隔移动
    const tile = input.getTilde(pos.x, pos.y);
    if (!tile || tile.type !== TildeType.flat) {
        return 'block'; // 河流、山丘、资源地形等都阻隔移动
    }

    // 检查是否有存活的单位
    for (const unit of Object.values(input.units)) {
        if (unit.hp > 0 && unit.x === pos.x && unit.y === pos.y) {
            return 'unit';
        }
    }

    // 检查是否有存活的建筑
    for (const building of Object.values(input.buildings)) {
        if (building.hp > 0 && building.x === pos.x && building.y === pos.y) {
            return 'building';
        }
    }

    return 'empty';
}

/**
 * 检查位置是否有效
 * @param input - 游戏状态
 * @param pos - 位置 {x, y}
 * @returns 位置是否有效
 */
export function isValidPosition(input: GameState, pos: {x: number, y: number}): boolean {
    return pos.x >= 0 && pos.x < input.battleState.width && 
           pos.y >= 0 && pos.y < input.battleState.height;
}